//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Container
// 文件名   : TestArray.h
// 作者     : Aiye
// 日期     : 2025/9/4 16:39
// 邮箱     : 2878548868@qq.com
// 摘要     : 介绍array
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CONTAINER_TESTARRAY_H
#define CONTAINER_TESTARRAY_H
#include <array>
#include <iostream>

#include "GlobalVariable.h"

class TestArray
{
public:
    /**
     * @brief 介绍构造函数
     */
    static void TestConstuctor()
    { // arrayC++11 仿数组创造的容器
        std::array<int , 3> nArr1; // 默认构造
        std::array<int , 3> nArr2{}; // 列表初始化构造
        std::array<int , 3> nArr3{1,2,3};
        auto nArr4 = nArr3; // 深拷贝。不共享内存
    }

    /**
     * @brief 介绍赋值操作
     */
    static void TestAssign()
    {
        std::array<std::string, 3> strArr1{"Hello", "Array", "World"};
        auto strArr2 = strArr1; // 赋值拷贝，深拷贝，不共享内存
        auto strArr3 = std::move(strArr2); // 移动赋值拷贝（对于基础类型，效果同拷贝）

        std::array<std::string, 3> strArr4{};
        // strArr4.assign(strArr1.begin(), strArr1.end()); // std::array 没有 assign 成员函数
        // strArr4.assign(3, "Hello"); // std::array 没有 assign 成员函数
        strArr4 = strArr1; // 使用赋值运算符进行整个容器的拷贝
    }

    static void TestCapacity()
    {
        std::array<int , 6> nArr{1,2,3,4,5,6}; //大小在编译期间固定为6
        std::cout << "The size:" << nArr.size() << std::endl; // 没有capacity（）成员
        // 也不存在pushback、popback

        std::cout << "The Container is empty: " << nArr.empty() << std::endl;
        constexpr auto arrSize = nArr.size(); // 获取编译期间大小 C++17
    }

    static void TestCRUD()
    {
        // 介绍“改”和“查”操作 (array 不支持动态的“增”和“删”)
        std::array<int, 8> nArr{1, 2, 3, 4, 5, 6, 7, 8};

        // [] 下标访问，不检查边界，性能最高
        std::cout << "The second element is: " << nArr[1] << std::endl;
        nArr[0] = 0; // 下标直接修改
        // nArr[20]; // 越界访问，未定义行为

        // at() 成员函数，进行边界检查，越界抛出 std::out_of_range 异常
        for (size_t i = 0; i < nArr.size(); ++i)
            {
            std::cout << "The element " << i << ": " << nArr.at(i) << std::endl;
        }
        nArr.at(1) = 1; // 安全的 at() 修改

        std::cout << "The first element is: " << nArr.front() << std::endl; // 获取首元素
        std::cout << "The last element is: " << nArr.back() << std::endl;  // 获取尾元素

        // data() 成员函数，返回指向底层数组的指针
        auto pNum = nArr.data();
        pNum[2] = 2; // 通过指针修改元素，与传统数组行为一致

        // 迭代器遍历修改
        auto it = nArr.begin(); // 获取起始迭代器
        *(it + 3) = 3;
        auto rit = nArr.rbegin(); // 获取反向迭代器
        *rit = 88; // 修改最后一个数据

        // 范围 for 循环修改
        for (int& elem : nArr)
        {
            if (elem > 3 && elem < 8)
            {
                elem--;
            }
        }

        // fill() 成员函数：将所有元素设置为特定值
        nArr.fill(42); // nArr 现在为 {42, 42, 42, 42, 42, 42, 42, 42}

        // swap() 成员函数：交换两个相同类型（即相同大小和元素类型）的 array 的内容
        std::array<int, 8> anotherArr{0};
        nArr.swap(anotherArr);

        // array 没有 insert, erase, push_back, pop_back, emplace 等动态修改大小的操作。
        // 其元素数量在编译期就已确定。
    }

};
#endif //CONTAINER_TESTARRAY_H